// ExpWaveProb.H

#ifndef EXPWAVEPROB_H
#define EXPWAVEPROB_H

#include <math.h>

#include "Global.H"
#include "WaveProb.H"

// Forward Declarations
class Epetra_SerialComm;
class Epetra_Map; 
class Epetra_Vector;
class Epetra_Import;
class Epetra_CrsGraph;
class Epetra_CrsMatrix;



class ExpWaveProb : public WaveProb
{ 
  private:
    double A;
    double B;
    double absp;
    // double Gamma(double p) { return A*exp(B*p); }
    // Continuous vorticity with internal stagnation:
    // 		double Gamma(double p) { return A*tanh(B*(-abs(p)+1)); }
    // Tetsu's vorciticy:  Notation : A = s, B = 2.5 for strong
    //  	vorticity and B = 0.5 for weak vorticity
    double Gamma(double p)
    {
      if ((0 <= absp) && (absp <= A*sqrt(g))) { return -B*sqrt(g/A); }
      else  { return B*g*sqrt(A)/(-abs(p)); }
    }
    double computeLambda();
    void initQ(double lambda);
    void computeInitial(double lambda);


  public:
    ExpWaveProb(int m, int n, double p0, double a, double b);
    explicit ExpWaveProb(char *solfile);
    ~ExpWaveProb();

    double getA() const { return A; }
    double getB() const { return B; }

    void setA(double a) { A = a; }
    void setB(double b) { B = b; }
};

#endif

